#ifndef __THREAD_HPP__
#define __THREAD_HPP__

#include<iostream>
#include<string>
#include<pthread.h>
#include<functional>
#include<sys/syscall.h>
#include<unistd.h>

using func_t = std::function<void()>;
#define get_lwp_id() syscall(SYS_gettid)
std::string threadnamedefault = "None-Name";

class Thread
{
public:
    Thread(func_t func , std::string name = threadnamedefault)
    :_func(func)
    ,_name(name)
    {}
    static void *start_routine(void* args)
    {
        Thread* self = static_cast<Thread*>(args);
        self->_lwpid = get_lwp_id();
        self->_func();
        pthread_exit((void*)0);
    }
    void Start()
    {
        //创建线程
        int n = pthread_create(&_tid , nullptr , start_routine , this);//可以传递仍以类型的参数
        if(n==0)
        {
            std::cout <<"创建线程成功" <<std::endl;
        }
    }
    void Join()
    {
        int n = pthread_join(_tid , nullptr);
        if(n==0)
        {
            std::cout <<"等待线程成功" <<std::endl;
        }
    }
    ~Thread()
    {}
private:
    pthread_t _tid;
    pid_t _lwpid;
    std::string _name;
    func_t _func;
};

// using func_t = std::function<void()>;
// const std::string threadnamedefault = "None-Name";
// #define get_lwp_id() syscall(SYS_gettid)

// //用类和对象的思想来封装线程的库函数
// class Thread
// {
// public:
//     Thread(func_t func ,const std::string& name = threadnamedefault)
//     :_func(func)
//     ,_name(name)
//     ,_isrunning(false)
//     {
//         std::cout << "create thread success" << std::endl;
//     }
//     //成员函数默认带有this  指针，可以加个static 让start_routine在类内实现
//     //静态成员函数不能直接使用非静态成员变量（可间接使用，例如：利用对象）
//     static void* start_routine(void* args)
//     {
//         std::cout << "走到了这里了吗" <<std::endl;
//         std::cout.flush();
//         Thread* self = static_cast<Thread*>(args);//将this 指针传递了过来
//         self->_isrunning = true;
//         self->_lwpid = get_lwp_id();
//         self->_func();
//         pthread_exit((void*)0);
//     }

//     //创建
//     void Start()
//     {
//         //创建线程
//         // std::cout << "走到了这里了吗" <<std::endl;
//         int n = pthread_create(&_tid , nullptr , start_routine , this);//第4个参数可以传任意类型的参数
//         if(n==0)
//         {
//             //创建线程成功
//             std::cout << "run thread success" << std::endl;
//         }
//     }
//     //等待
//     void Join()
//     {
//         std::cout << "走到了这里了吗" << _isrunning <<std::endl;
//         //如果进程未运行就不等待
//         // if(!_isrunning) return;

//         std::cout << "join 开头" <<std::endl;

//         int n = pthread_join(_tid,nullptr);
//         if(n==0)
//         {
//             std::cout << "pthread_join success" <<std::endl;
//         }
//         else{
//             std::cout << "等待线程失败" <<std::endl;
//         }
//     }
//     ~Thread()
//     {}
// private:
//     bool _isrunning;
//     pthread_t _tid;
//     pid_t _lwpid;
//     std::string _name;
//     func_t _func;
// };

#endif